#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 03_sum_calculation_description_statistics.py
@time: 2022/10/20  13:52
# @describe: 5.3 汇总和计算描述统计
"""
# pandas对象拥有一组常用的数学和统计方法。它们大部分都属于约简和汇总统计，
# 用于从Series中提取单个值（如sum或mean）或从DataFrame的行或列中提取一个Series。
# 跟对应的NumPy数组方法相比，它们都是基于没有缺失数据的假设而构建的。
# 看一个简单的DataFrame：
import numpy as np
import pandas as pd

df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
                   [np.nan, np.nan], [0.75, -1.3]],
                    index=['a', 'b', 'c', 'd'],
                    columns=['one', 'two'])
print(df)

# 调用DataFrame的sum方法将会返回一个含有列的和的Series：
print(df.sum())

# 传入axis=’columns’或axis=1将会按行进行求和运算：
print(df.sum(axis=1))

# NA值会自动被排除，除非整个切片（这里指的是行或列）都是NA。通过skipna选项可以禁用该功能：
print(df.mean(axis='columns', skipna=False))


# 有些方法（如idxmin和idxmax）返回的是间接统计（比如达到最小值或最大值的索引）：
print(df.idxmax())

# 另一些方法则是累计型的：
print(df.cumsum())

# 还有一种方法，它既不是约简型也不是累计型。describe就是一个例子，它用于一次性产生多个汇总统计：
print(df.describe())

# 对于非数值型数据，describe会产生另外一种汇总统计：
obj = pd.Series(['a', 'a', 'b', 'c'] * 4)
print(obj.describe())
print("******************")



"""
相关系数与协方差：
    有些汇总统计（如相关系数和协方差）是通过参数对计算出来的。我们来看几个DataFrame，它们的数据来自Yahoo!Finance的股票价格和成交量，
    使用的是pandas-datareader包（可以用conda或pip安装）：
    文档地址：https://pypi.org/project/pandas-datareader/
"""
import pandas_datareader as pdr
import pandas_datareader.data as web
import pandas as pd
import datetime as dt

# 读取美国政府债券的 5 年期 10 年期固定期限收益率。
print(pdr.get_data_fred('GS10'))

# 纳维金融提供韩国股市（科斯皮指数，科斯达克）历史数据。
df = web.DataReader('005930', 'naver', start='2019-09-10', end='2019-10-09')
print(df.head())




"""" 唯一值、值计数以及成员资格 """
# 还有一类方法可以从一维Series的值中抽取信息
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
# 第一个函数是unique，它可以得到Series中的唯一值数组：
uniques = obj.unique()
print("******************")
print(uniques)

# value_counts用于计算一个Series中各值出现的频率：
print(obj.value_counts())

# 为了便于查看，结果Series是按值频率降序排列的。value_counts还是一个顶级pandas方法，可用于任何数组或序列：
print(pd.value_counts(obj.values, sort=False))

# isin用于判断矢量化集合的成员资格，可用于过滤Series中或DataFrame列中数据的子集：
print(obj)
mask = obj.isin(['b', 'c'])
print(mask)
print(obj[mask])

# 与isin类似的是Index.get_indexer方法，它可以给你一个索引数组，从可能包含重复值的数组到另一个不同值的数组：
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
uniques_vals = pd.Series(['c', 'b', 'a'])
print(pd.Index(uniques_vals).get_indexer(to_match))


# 有时，你可能希望得到DataFrame中多个相关列的一张柱状图。例如：
data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
                    'Qu2': [2, 3, 1, 2, 3],
                    'Qu3': [1, 5, 2, 4, 4]})
print(data)

# 将pandas.value_counts传给该DataFrame的apply函数，就会出现：
result = data.apply(pd.value_counts).fillna(0)
# fillna: 不存在时，默认的值。
# 这里，结果中的行标签是所有列的唯一值。后面的频率值是每个列中这些值的相应计数。
print(result)